`timescale 1ns/1ps
`default_nettype none
module ex_mem_reg(
    input  wire        clk,          // 时钟：上升沿触发
    input  wire        rstn,         // 同步复位（低有效）：拉低时清零所有输出寄存器
    // ---------- 来自 EX 阶段（本拍产生） ----------
    input  wire [31:0] ex_alu_y,     // EX 阶段 ALU 计算结果（加/减等）
    input  wire [31:0] ex_wdata,     // ★ 来自前递后的 rs2（用于 SW 写数据）
    input  wire [31:0] ex_pc4,       // ★ 新增：JAL 的 link 值（pc+4）
    input  wire [4:0]  ex_rd,        // 本条指令的目的寄存器号（将随流水线一路带到 WB）
    input  wire        ex_regwrite,  // 本条指令是否需要在 WB 写回寄存器
    input  wire        ex_memread,   // ★
    input  wire        ex_memwrite,  // ★
    input  wire        ex_memtoreg,  // ★
    input  wire        ex_jal,       // ★ 新增：此拍是否为 JAL
    input  wire        ex_jalr,      // ★ 新增 JALR

    // ---------- 输出到 MEM 阶段（下一拍被使用） ----------
    output reg  [31:0] mem_alu_y,    // 打拍后的 ALU 结果 → MEM 阶段（未来可作地址或写回值）
    output reg  [31:0] mem_wdata,    // ★
    output reg  [31:0] mem_pc4,      // ★ 新增
    output reg  [4:0]  mem_rd,       // 打拍后的 rd → 传递到 MEM/WB，再到 WB
    output reg         mem_regwrite,  // 打拍后的写回使能 → 贯穿至 WB 控制写使能
    output reg         mem_memread,  // ★
    output reg         mem_memwrite, // ★
    output reg         mem_memtoreg,  // ★
    output reg         mem_jal,       // ★ 新增
    output reg         mem_jalr       // ★ 新增JALR
);
    // 时序逻辑：同步复位清零；否则把 EX 信号在时钟上升沿锁存到 MEM 输出
    always @(posedge clk) begin
        if (!rstn) begin
            mem_alu_y    <= 32'b0;
            mem_wdata    <= 32'b0;
            mem_pc4      <= 32'b0;
            mem_rd       <= 5'b0;
            mem_regwrite <= 1'b0;
            mem_memread  <= 1'b0;
            mem_memwrite <= 1'b0;
            mem_memtoreg <= 1'b0;
            mem_jal      <= 1'b0;
            mem_jalr     <= 1'b0; 
        end else begin
            mem_alu_y    <= ex_alu_y;
            mem_wdata    <= ex_wdata;
            mem_pc4      <= ex_pc4;       // ★
            mem_rd       <= ex_rd;
            mem_regwrite <= ex_regwrite;
            mem_memread  <= ex_memread;
            mem_memwrite <= ex_memwrite;
            mem_memtoreg <= ex_memtoreg;
            mem_jal      <= ex_jal;       // ★
            mem_jalr     <= ex_jalr;
        end
    end
endmodule